import { BaseType, FormItemTypeEnum } from '@/components/base/form-item/props/form-item-type'
import type { Dayjs } from 'dayjs'
import type { Rule } from 'ant-design-vue/es/form'
import {
  AutoCompleteParams,
  CascaderParams,
  CheckBoxParams,
  DatePickerParams,
  InputNumberParams,
  InputParams,
  MentionsParams,
  RadioParams,
  RangePickerParams,
  RateParams,
  SelectParams,
  SliderParams,
  SwitchParams,
  TimePickerParams,
  TimeRangePickerParams,
  TransferParams,
  TreeSelectParams,
} from '@/components/base/form-item/props/form-item-params'
import { EditorProps } from '@/components/base/base-editor/editor-config'
import { FileProps } from '@/components/base/base-upload/BaseUpload.vue'

/**
 * 自动完成表单项
 */
interface AutoCompleteFormItemProps<Entity> extends BaseFormItemProps<Entity> {
  // 类型
  type: FormItemTypeEnum.AUTO_COMPLETE | 'auto-complete'
  // 表单项参数
  params?: AutoCompleteParams
}

/**
 * 级联表单项
 */
interface CascaderFormItemProps<Entity = 'cascader'> extends BaseFormItemProps<Entity> {
  // 类型
  type: FormItemTypeEnum.CASCADER | 'cascader'
  // 表单项参数
  params?: CascaderParams
}

/**
 * 多选表单项
 */
interface CheckBoxFormItemProps<Entity> extends BaseFormItemProps<Entity> {
  // 类型
  type: FormItemTypeEnum.CHECKBOX | 'checkbox'
  // 表单项参数
  params?: CheckBoxParams
}

/**
 * 时间选择
 */
interface DatePickerFormItemProps<Entity> extends BaseFormItemProps<Entity> {
  // 类型
  type: FormItemTypeEnum.DATE_PICKER | 'date-picker'
  // 表单项参数
  params?: DatePickerParams
}

/**
 * 时间范围选择
 */
interface RangePickerFormItemProps<Entity> extends BaseFormItemProps<Entity> {
  // 类型
  type: FormItemTypeEnum.RANGE_PICKER | 'range-picker'
  // 表单项参数
  params?: RangePickerParams
}

/**
 * 输入
 */
interface InputFormItemProps<Entity> extends BaseFormItemProps<Entity> {
  // 类型
  type: FormItemTypeEnum.INPUT | 'input'
  // 表单项参数
  params?: InputParams
}

/**
 * 数字输入
 */
interface InputNumberFormItemProps<Entity> extends BaseFormItemProps<Entity> {
  // 类型
  type: FormItemTypeEnum.INPUT_NUMBER | 'input-number'
  // 表单项参数
  params?: InputNumberParams
}

/**
 * 提及
 */
interface MentionsFormItemProps<Entity> extends BaseFormItemProps<Entity> {
  // 类型
  type: FormItemTypeEnum.MENTIONS | 'mentions'
  // 表单项参数
  params?: MentionsParams
}

/**
 * 单选
 */
interface RadioFormItemProps<Entity> extends BaseFormItemProps<Entity> {
  // 类型
  type: FormItemTypeEnum.RADIO | 'radio'
  // 表单项参数
  params?: RadioParams
}

/**
 * 评分
 */
interface RateFormItemProps<Entity> extends BaseFormItemProps<Entity> {
  // 类型
  type: FormItemTypeEnum.RATE | 'rate'
  // 表单项参数
  params?: RateParams
}

/**
 * 选择器
 */
interface SelectFormItemProps<Entity> extends BaseFormItemProps<Entity> {
  // 类型
  type: FormItemTypeEnum.SELECT | 'select'
  // 表单项参数
  params?: SelectParams
}

/**
 * 滑动输入条
 */
interface SliderFormItemProps<Entity> extends BaseFormItemProps<Entity> {
  // 类型
  type: FormItemTypeEnum.SLIDER | 'slider'
  // 表单项参数
  params?: SliderParams
}

/**
 * 开关
 */
interface SwitchFormItemProps<Entity> extends BaseFormItemProps<Entity> {
  // 类型
  type: FormItemTypeEnum.SWITCH | 'switch'
  // 表单项参数
  params?: SwitchParams
}

/**
 * 时间选择框
 */
interface TimePickerFormItemProps<Entity> extends BaseFormItemProps<Entity> {
  // 类型
  type: FormItemTypeEnum.TIME_PICKER | 'time-picker'
  // 表单项参数
  params?: TimePickerParams
}

/**
 * 时间范围选择框
 */
interface TimeRangePickerFormItemProps<Entity> extends BaseFormItemProps<Entity> {
  // 类型
  type: FormItemTypeEnum.TIME_RANGE_PICKER | 'time-range-picker'
  // 表单项参数
  params?: TimeRangePickerParams
}

/**
 * 穿梭框
 */
interface TransferFormItemProps<Entity> extends BaseFormItemProps<Entity> {
  // 类型
  type: FormItemTypeEnum.TRANSFER | 'transfer'
  // 表单项参数
  params?: TransferParams
}

/**
 * 树选择
 */
interface TreeSelectFormItemProps<Entity> extends BaseFormItemProps<Entity> {
  // 类型
  type: FormItemTypeEnum.TREE_SELECT | 'tree-select'
  // 表单项参数
  params?: TreeSelectParams
}

/**
 * 文件上传
 */
interface UploadFormItemProps<Entity> extends BaseFormItemProps<Entity> {
  // 类型
  type: FormItemTypeEnum.UPLOAD | 'upload'
  // 表单项参数
  params?: FileProps
}

/**
 * 富文本
 */
interface EditorFormItemProps<Entity> extends BaseFormItemProps<Entity> {
  // 类型
  type: FormItemTypeEnum.EDITOR | 'editor'
  // 表单项参数
  params?: EditorProps
}

/**
 * 基础表单项属性
 */
interface BaseFormItemProps<Entity> {
  // 表单域 model 字段，在使用 validate、resetFields 方法的情况下，该属性是必填的
  name: keyof Entity
  // 表单项绑定值(查询、修改时显示用)
  value?: BaseType | Dayjs
  // 标签名
  label?: string
  // 表单验证规则
  rules?: object | Rule[]
  // 当某一规则校验不通过时，是否停止剩下的规则的校验。
  validateFirst?: boolean
  // 标签文本对齐方式
  labelAlign?: 'left' | 'right'
  // 是否必填，如不设置，则会根据校验规则自动生成
  required?: boolean
  // 提示信息，如不设置，则会根据校验规则自动生成
  placeholder?: string | Array<string>
  // 是否必填，如不设置，则会根据校验规则自动生成
  help?: string
  // 是否禁用
  disabled?: boolean
  // label 标签布局
  labelCol?: { offset: number; span: number }
  // 列偏移
  wrapperCol?: { offset: number; span: number }
  // 配合 validateStatus 属性使用，展示校验状态图标，建议只配合 Input 组件使用
  hasFeedback?: boolean
  // 额外的提示信息，和 help 类似，当需要错误信息和提示文案同时出现时，可以使用这个。
  extra?: string
  // 配合 label 属性使用，表示是否显示 label 后面的冒号
  colon?: boolean
  // 是否显示
  show?: boolean
}
export type {
  AutoCompleteFormItemProps,
  CascaderFormItemProps,
  CheckBoxFormItemProps,
  DatePickerFormItemProps,
  RangePickerFormItemProps,
  InputFormItemProps,
  InputNumberFormItemProps,
  MentionsFormItemProps,
  RadioFormItemProps,
  RateFormItemProps,
  SelectFormItemProps,
  SliderFormItemProps,
  SwitchFormItemProps,
  TimePickerFormItemProps,
  TransferFormItemProps,
  TreeSelectFormItemProps,
  UploadFormItemProps,
  EditorFormItemProps,
  TimeRangePickerFormItemProps,
  BaseFormItemProps,
}
